package pruebas;

import junit.framework.TestCase;
import negModel.*;
import negModelExcep.eParteNoFunciona;

public class TallerTest extends TestCase {

	ListaPartes l,lt,listaPartesTaller;

	Aleron aleron1,aleron2,aleron3;
	Carroceria carroc1,carroc2,carroc3;
	Combustible comb1;
	Tanque tanque1,tanque2,tanque3;
	ControladorDeCombustible cont1,cont2,cont3;
	Escape esc1,esc2,esc3;
	Llanta llan1,llan2,llan3;
	Neumatico neum1,neum2,neum3; 
	Rueda rue1,rue2,rue3; 
	
	Aleron aleron;
	Carroceria carroc;
	Combustible comb;
	Tanque tanque;
	ControladorDeCombustible controlador;
	Escape escape;
	Llanta llanta;
	Neumatico neum; 
	Rueda rueda; 
	Transmision t1,t2,trans1,trans2,trans3;
	Motor m1,m2,motor1,motor2,motor3;
	Parte p;
	Auto auto;
	Taller taller,tallerPersist;
	
	protected void setUp() throws Exception {
		super.setUp();
		lt = new ListaPartes();
		listaPartesTaller = new ListaPartes();
		l = new ListaPartes();
		
		aleron1 = new Aleron(1000,15,5,new String("Aleron tipo 1"),new AlgoPesos(100),true,5,4,8,10);
		aleron2 = new Aleron(1500,20,6,new String("Aleron tipo 2"),new AlgoPesos(150),true,10,5,8,10);
		aleron3 = new Aleron(2000,25,7,new String("Aleron tipo 3"),new AlgoPesos(200),true,15,6,8,10);
		
		carroc1 = new Carroceria (1000,500,3,new String("Carroceria pesada"),new AlgoPesos(1000),true,5,1,10,10,80,100);
		carroc2 = new Carroceria (1500,300,5,new String("Carroceria peso medio"),new AlgoPesos(2000),true,5,1,8,10,80,100);
		carroc3 = new Carroceria (2000,200,7,new String("Carroceria liviana"),new AlgoPesos(5000),true,5,1,10,10,80,100);
		
		comb1 = new Combustible(88,1);
		
		tanque1 = new Tanque(1000,50,new String ("Tanque capacidad 1"),new AlgoPesos(100),true,100,100,comb1);
		tanque2 = new Tanque(1500,60,new String ("Tanque capacidad 2"),new AlgoPesos(200),true,125,200,comb1);
		tanque3 = new Tanque(2000,70,new String ("Tanque capacidad 3"),new AlgoPesos(300),true,150,300,comb1);
		tanque1.cargarComb();
		
		cont1 = new ControladorDeCombustible (1000,50,10,new String("Sistema de Inyeccion 1 - porcentaje 70%"),new AlgoPesos(100),true,10,7);
		cont2 = new ControladorDeCombustible (1500,60,15,new String("Sistema de Inyeccion 2 - porcentaje 80%"),new AlgoPesos(200),true,15,8);
		cont3 = new ControladorDeCombustible (2000,50,20,new String("Sistema de Inyeccion 3 - porcentaje 90%"),new AlgoPesos(300),true,20,9);
		
		esc1 = new Escape(1000,20,70,new String("Escape 1 - eliminacion 70%"),new AlgoPesos(100),true,100,7);
		esc2 = new Escape(1500,22,80,new String("Escape 2 - eliminacion 80%"),new AlgoPesos(300),true,150,8);
		esc3 = new Escape(2000,24,90,new String("Escape 3 - eliminacion 90%"),new AlgoPesos(500),true,200,9);
		
		llan1 = new Llanta (1000,25,165,new String ("Llanta pesada"),new AlgoPesos(100),false,10,0.05);
		llan2 = new Llanta (1500,20,175,new String ("Llanta peso medio"),new AlgoPesos(400),false,15,0.05);
		llan3 = new Llanta (2000,18,185,new String ("Llanta liviana"),new AlgoPesos(600),false,20,0.05);
		
		neum1 = new Neumatico(1000,20,150,new String ("Neumatico leve adhesion"),new AlgoPesos(100),false,10,100,10,3);
		neum2 = new Neumatico(1500,22,160,new String ("Neumatico media adhesion"),new AlgoPesos(350),false,15,100,10,4);
		neum3 = new Neumatico(2000,23,180,new String ("Neumatico alta adhesion"),new AlgoPesos(700),false,20,100,10,5);
		
		rue1 = new Rueda(llan1,neum1,new String ("Rueda con "+ neum1.getDetalle()+" y "+ llan1.getDetalle()),false);
		rue2 = new Rueda(llan2,neum2,new String ("Rueda con "+ neum2.getDetalle()+" y "+ llan2.getDetalle()),false);
		rue3 = new Rueda(llan3,neum3,new String ("Rueda con "+ neum3.getDetalle()+" y "+ llan3.getDetalle()),false);
		
		trans1 = new Transmision(1000,50,50,new String("Transmision tipo 1 - cambios 5 - Manual"),new AlgoPesos(1000),false,50,5,true);
		trans2 = new Transmision(1500,60,70,new String("Transmision tipo 2 - cambios 5 - Manual"),new AlgoPesos(1500),false,75,5,true);
		trans3 = new Transmision(2000,70,90,new String("Transmision tipo 3 - cambios 5 - Automatica"),new AlgoPesos(2000),false,100,5,false);
		
		motor1 = new Motor(1000,140,200,new String("Motor Chevrolet 1000 cc"),new AlgoPesos(1000),false,100,1000);
		motor2 = new Motor(1500,170,300,new String("Motor Audi 1500 cc"),new AlgoPesos(1500),false,150,1500);
		motor3 = new Motor(2000,200,500,new String("Motot BMW 2000 cc"),new AlgoPesos(2000),false,200,2000);
		
		listaPartesTaller.add(aleron1);
		listaPartesTaller.add(aleron2);
		listaPartesTaller.add(aleron3);
		listaPartesTaller.add(carroc1);
		listaPartesTaller.add(carroc2);
		listaPartesTaller.add(carroc3);
		listaPartesTaller.add(tanque1);
		listaPartesTaller.add(tanque2);
		listaPartesTaller.add(tanque3);
		listaPartesTaller.add(cont1);
		listaPartesTaller.add(cont2);
		listaPartesTaller.add(cont3);
		listaPartesTaller.add(esc1);
		listaPartesTaller.add(esc2);
		listaPartesTaller.add(esc3);
		listaPartesTaller.add(rue1);
		listaPartesTaller.add(rue2);
		listaPartesTaller.add(rue3);
		listaPartesTaller.add(trans1);
		listaPartesTaller.add(trans2);
		listaPartesTaller.add(trans3);
		listaPartesTaller.add(motor1);
		listaPartesTaller.add(motor2);
		listaPartesTaller.add(motor3);
		
		tallerPersist = new Taller(listaPartesTaller);
		
		
		aleron = new Aleron(1000,15,5,new String("Aleron"),new AlgoPesos(100),true,5,5,8,10);
		carroc = new Carroceria (100,500,3,new String("carr1"),new AlgoPesos(100),true,5,1,10,10,80,100);
		comb = new Combustible(88,88);
		tanque = new  Tanque(100,50,new String ("tanque"),new AlgoPesos(100),true,100,100,comb);
		tanque.cargarComb();
		controlador = new ControladorDeCombustible (1000,50,10,new String("Sistema de Inyeccion"),new AlgoPesos(100),true,10,7);
		escape = new Escape(100,20,70,new String("escape"),new AlgoPesos(100),true,100,8);
		llanta = new Llanta (100, 25,165,new String ("llanta1"),new AlgoPesos(100),false,10,0.05);
		neum = new Neumatico(100,20,150,new String ("neum"),new AlgoPesos(100),false,10,100,10,3);
		rueda = new Rueda(llanta,neum,new String ("rueda1"),false);
		m1 = new Motor (1000,140,500,new String("Mot1"),new AlgoPesos(100),false,100,1000);
		m2 = new Motor (1000,140,500,new String("Mot1"),new AlgoPesos(100),false,100,1000);
		t1 = new Transmision(100,50,50,new String("trans"),new AlgoPesos(100),false,50,5,true);
		t2 = new Transmision(100,50,50,new String("trans"),new AlgoPesos(100),false,50,5,true);
		
		
		
		l.add(aleron);
		l.add(carroc);
		l.add(tanque);
		l.add(controlador);
		l.add(escape);
		l.add(rueda);
		l.add(m1);
		l.add(t1);
		
				
		auto = new Auto(l,"auto");
		
		lt.add(aleron);
		lt.add(carroc);
		taller = new Taller(lt);
		
		
		
	}

	public void testEvaluarCostoDeArregloTotal() {
		try {
			aleron.gastar();
			aleron.gastar();
			carroc.gastar();
		} catch (eParteNoFunciona e) {
			fail("se elevo eParteNoFunciona");
		}
		
		AlgoPesos costo = taller.evaluarCostoDeArregloTotal(auto);
		assertEquals(3,costo.getMonto(),0);
	}

	public void testEvaluarCostoDeArreglo() {
		try {
			aleron.gastar();
			aleron.gastar();
		} catch (eParteNoFunciona e) {
			fail("se elevo eParteNoFunciona");
		}
		
		AlgoPesos costo = taller.evaluarCostoDeArreglo(aleron);
		assertEquals(2,costo.getMonto(),0);
	}

	public void testArreglarPartes() {
		taller.arreglarPartes(auto);
	}

	public void testArreglarParte() {
		taller.arreglarParte(aleron);
	}

	public void testEnsamblarParte() {
		
	}

	public void testMostrarPartesParaComprar() {
		assertEquals(lt,taller.mostrarPartesParaComprar());
	}
	
	public void testGuardar() throws Exception{
		Taller.guardar("Taller.xml",tallerPersist);
			
	}
	
	public void testCargar() throws Exception{
		Taller unTaller = Taller.cargar("Taller.xml");
		ListaPartes listaAux = unTaller.mostrarPartesParaComprar();
		
		Aleron aleAux = (Aleron)listaAux.devolverParte(aleron1.getClass());
			assertEquals(aleAux.getLargo(),aleron1.getLargo(),0);
			assertEquals(aleAux.getParteInferior(),aleron1.getParteInferior(),0);
			assertEquals(aleAux.getParteSuperior(),aleron1.getParteSuperior(),0);
	
		Motor motorAux = (Motor)listaAux.devolverParte(motor1.getClass());
			assertEquals(motorAux.getRpmMax(),motor1.getRpmMax(),0);
			assertEquals(motorAux.getPerformance(),motor1.getPerformance(),0);
		
	}

}
